import wave
import math
import sys
import executorAnalise
import correlacao

class EncontraTeta:

	def __init__(self,quantidade,dm,arq1='../audio/rec1.wav',arq2='../audio/rec2.wav',arq3='../audio/rec3.wav'):
		self.qnt = quantidade
		self.inicializaExecutores(quantidade,arq1,arq2,arq3)
		self.dm = dm
		self.correlacao = correlacao.Correlacao()
	
	def inicializaExecutores(self,qnt,arq1,arq2,arq3):
		if qnt == 1:
			self.executores = [executorAnalise.ExecutorAnalise(wave.open(arq1)),
									executorAnalise.ExecutorAnalise(wave.open(arq2))]			
		else:
			self.executores = [executorAnalise.ExecutorAnalise(wave.open(arq1)),
									executorAnalise.ExecutorAnalise(wave.open(arq2)),
									executorAnalise.ExecutorAnalise(wave.open(arq3))]
	
	def verificaExecTerminados(self):
		resultado = True
		prontos = []
		for i in range(len(self.executores)):
			if self.executores[i].terminou:
				prontos.append(i)
			else:
				resultado = False
		return (resultado,prontos)
		
	def analisar(self):
			for executor in self.executores:
				executor.start()
			print 'Calculando os Tetas'
			while True:
				(todosProntos,prontos) = self.verificaExecTerminados()
				if todosProntos == True:
					print 'Analise concluida'
					break
	
	def calculaAtraso(self,analise1,analise2):
		idAmostra1 = analise1.indiceMaior
		idAmostra2 = analise2.indiceMaior
		itdA = (idAmostra2-idAmostra1) 
		return float(itdA) / analise1.rate
		
	def calculaAtraso2(self,analise1,analise2):
		Vs = 340.29 * 100
		Mmax = int(self.dm/Vs*analise1.rate)+1
		print 'max: %s' % Mmax
		itdA = self.correlacao.cruzada(analise1.amostras,analise2.amostras,analise1.media,analise2.media,Mmax)
		return float(itdA) / analise1.rate
			
	def encontraTetas(self):
			Dm = self.dm			# centimetros
			Vs = 340.29 * 100		# cm/s
			self.tetas = []
			for i in range(0,len(self.executores)):
				for j in range(i+1,len(self.executores)):
					ITD = self.calculaAtraso(self.executores[i].analise,self.executores[j].analise)
					senoTeta = (Vs*ITD)/Dm
					#print '\natraso: %s \nvs*ITD: %s\tcm\nDm:\t%s\t\tcm\nseno(teta): %s' % (ITD,Vs*ITD,Dm,senoTeta)
					print '\natraso de %s-%s %s' % (j,i,ITD)
					#print self.executores[i].analise.segundoMaiorAmostra()
					#print self.executores[i].analise.indiceMaior
					#print self.executores[j].analise.segundoMaiorAmostra()
					#print self.executores[j].analise.indiceMaior
					try:
						self.tetas.append( (math.asin( senoTeta )) )
					except:
						self.tetas.append(0)
						
	def getTetas(self):
		return self.tetas

		
#-------------------------------------------
if __name__ == '__main__':
	enc = EncontraTeta(3,30)
	enc.analisar()
	enc.encontraTetas()
	for teta in enc.getTetas():
		print math.degrees(teta)
	
				
